package cn.wolfcode.luowowo.mgrsite.listener;

import cn.wolfcode.luowowo.article.domain.StrategyDetail;
import cn.wolfcode.luowowo.article.domain.Travel;
import cn.wolfcode.luowowo.article.service.IStrategyDetailService;
import cn.wolfcode.luowowo.article.service.ITravelService;
import cn.wolfcode.luowowo.cache.service.IScenicStaticVOService;
import cn.wolfcode.luowowo.cache.service.IStrategyStatisVOService;
import cn.wolfcode.luowowo.cache.service.ITravelStatisVOService;
import cn.wolfcode.luowowo.cache.service.IUserInfoStaticVOService;
import cn.wolfcode.luowowo.cache.vo.ScenicStaticVO;
import cn.wolfcode.luowowo.cache.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.cache.vo.TravelStatisVO;
import cn.wolfcode.luowowo.cache.vo.UserInfoStatisVO;
import cn.wolfcode.luowowo.common.util.BeanUtil;
import cn.wolfcode.luowowo.member.domain.UserInfo;
import cn.wolfcode.luowowo.member.service.IUserInfoService;
import cn.wolfcode.luowowo.scenic.domain.Scenic;
import cn.wolfcode.luowowo.scenic.service.IScenicService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * redis数据初始化监听器
 * 泛型:是你要使用的监听器
 * spring容器启动,并且完成一些相关初始化操作:IOD,DI,AOP
 * 问题:覆盖问题mysql的数据放到redis中,当我这个服务需要维护的时候,那么就的关掉这个后台服务
 * 那么重新启动,会将原先在redis数据进行覆盖,所以需要进行排除
 * //如果redis中已经存在,会直接掉过
 */
@Component//交给spring容器管理
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent> {
    //引入服务  进行vo的初始化
    @Reference
    private IStrategyStatisVOService strategyStatisVOService;
    @Reference
    private IStrategyDetailService strategyDetailService;
    //引入游记相关数据的初始化操作
    @Reference
    private ITravelService travelService;
    @Reference
    private ITravelStatisVOService travelStatisVOService;
    //引入用户相关数据的初始化操作
    @Reference
    private IUserInfoService userInfoService;
    @Reference
    private IUserInfoStaticVOService userInfoStaticVOService;


    //引入景点相关数据的初始化操作
    @Reference
    private IScenicStaticVOService scenicStaticVOService;
    @Reference
    private IScenicService scenicService;
    //当这个事件发生之后,执行这个方法
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("--------------攻略vo初始化开始操作--------------");
        StrategyStatisVO vo = null;
        List<StrategyDetail> strategyDetailss = strategyDetailService.list();
        for (StrategyDetail strategyDetail : strategyDetailss) {
            //解决覆盖问题
            if(strategyStatisVOService.isVoExsit(strategyDetail.getId())){
                continue;
            }
            vo=new StrategyStatisVO();
            //把明细里面的内容放到vo对象中  有个工具类帮我们拷贝相同的属性然后到vo中,第一个参数是需要拷贝到的目标对象,第二个参数的复制对象
            BeanUtil.copyProperties(vo,strategyDetail);
            //拷贝不同属性到vo对象中
            vo.setStrategyId(strategyDetail.getId());
            vo.setDestId(strategyDetail.getDest().getId());
            vo.setDestName(strategyDetail.getDest().getName());
            vo.setAuthorId(strategyDetail.getAuthor().getId());//作者id
            vo.setAuthorName(strategyDetail.getAuthor().getNickname());//作者名字
            vo.setHeadImgUrl(strategyDetail.getAuthor().getHeadImgUrl());//作者头像
            //创建vo对象放到redis中
            strategyStatisVOService.setStrategyStatisVO(vo);
        }
        System.out.println("--------------攻略vo初始化结束操作--------------");
        System.out.println("--------------游记vo初始化开始操作--------------");
        TravelStatisVO tvo = null;
        List<Travel> travels = travelService.list();
        for (Travel travel : travels) {
            //解决覆盖问题 当前vo对象如果存在那么就跳过
            if(travelStatisVOService.isVoExsit(travel.getId())){
                continue;
            }
            tvo=new TravelStatisVO();
            //把明细里面的内容放到vo对象中  有个工具类帮我们拷贝相同的属性然后到vo中,第一个参数是需要拷贝到的目标对象,第二个参数的复制对象
            BeanUtil.copyProperties(tvo,travel);
            //拷贝不同属性到vo对象中
            tvo.setTravelId(travel.getId());
            tvo.setDestId(travel.getDest().getId());
            tvo.setDestName(travel.getDest().getName());
            tvo.setAuthorId(travel.getAuthor().getId());//作者id
            tvo.setAuthorName(travel.getAuthor().getNickname());//作者名字
            tvo.setHeadImgUrl(travel.getAuthor().getHeadImgUrl());//作者头像
            //创建vo对象放到redis中进行数据初始化操作
            travelStatisVOService.setTravelStatisVO(tvo);
        }
        System.out.println("--------------游记vo初始化结束操作--------------");


        System.out.println("--------------用户VO初始化begin--------------");
        UserInfoStatisVO uvo = null;
        List<UserInfo> users = userInfoService.list();

        for (UserInfo u : users) {
            //解决覆盖问题
            if(userInfoStaticVOService.isVoExsit(u.getId())){
                continue;
            }
            uvo=new UserInfoStatisVO();
            //把明细里面的内容放到vo对象中  有个工具类帮我们拷贝相同的属性然后到vo中,第一个参数是需要拷贝到的目标对象,第二个参数的复制对象
            BeanUtil.copyProperties(uvo,u);
            //拷贝不同属性到vo对象中
            uvo.setId(u.getId());
            //创建vo对象放到redis中
            userInfoStaticVOService.setUserInfoStaticVO(uvo);
        }
        System.out.println("--------------用户VO初始化end--------------");



        System.out.println("--------------景点vo初始化开始操作--------------");
        ScenicStaticVO svo = null;
        List<Scenic> scenics =scenicService.list();
        for (Scenic scenic : scenics) {
            //解决覆盖问题 当前vo对象如果存在那么就跳过
            if(scenicStaticVOService.isVoExsit(scenic.getId())){
                continue;
            }
            svo=new ScenicStaticVO();
            //把明细里面的内容放到vo对象中  有个工具类帮我们拷贝相同的属性然后到vo中,第一个参数是需要拷贝到的目标对象,第二个参数的复制对象
            BeanUtil.copyProperties(svo,scenic);
            //拷贝不同属性到vo对象中
            //创建vo对象放到redis中进行数据初始化操作
            svo.setScenicId(scenic.getId());
            svo.setDestName(scenic.getDest().getName());
            svo.setDestId(scenic.getDest().getId());
            scenicStaticVOService.setScenicStatisVO(svo);
        }
        System.out.println("--------------景点vo初始化结束操作--------------");
     //
      /*System.out.println("--------------热门推荐初始化开始操作--------------");
        //1:查询所有需要初始化数据//所有明细数据
        List<StrategyDetail> strategyDetails = strategyDetailService.list();
        for (StrategyDetail strategyDetail : strategyDetails) {
            //如果zset已经存在某个column需要直接跳过//不然会出现数据库中的数据多了200,然后进行添加分数的时候
            //如果再次启动,没有进行跳过,那么会重复讲mysql中的数据的分数偏移到redis上  所以要进行value-column判断
            if(strategyDetail.isIsabroad() || strategyStatisVOService.isColumnExistsZset(strategyDetail.getId(), RedisKeys.STRATEGY_ZSET_HOT.getPrefix())){
                continue;//因为拿到的是所有的list的//那么还要把国外的字段也排除出去不然会把国外的字段也加进去虽然不会加分
            }
            int scores = strategyDetail.getViewnum()+strategyDetail.getReplynum();
            strategyStatisVOService.addHotScore(strategyDetail.getId(),scores);
        }
        System.out.println("---------------热门推荐初始化结束操作--------------");
        System.out.println("--------------国内推荐初始化开始操作--------------");
        //1:查询所有需要初始化数据//所有明细数据
        for (StrategyDetail strategyDetail : strategyDetails) {
            //如果zset已经存在某个column需要直接跳过//不然会出现数据库中的数据多了200,然后进行添加分数的时候
            //如果再次启动,没有进行跳过,那么会重复讲mysql中的数据的分数偏移到redis上  所以要进行value-column判断
            if( !strategyDetail.isIsabroad()|| strategyStatisVOService.isColumnExistsZset(strategyDetail.getId(), RedisKeys.STRATEGY_ZSET_UNABROADCDS.getPrefix())){
                continue;
            }
            int scores = strategyDetail.getFavornum()+strategyDetail.getThumbsupnum();
            strategyStatisVOService.addAboardOrChinaScore(strategyDetail.getId(),scores);
        }
        System.out.println("---------------国内推荐初始化结束操作--------------");
        System.out.println("--------------国外推荐初始化开始操作--------------");
        //1:查询所有需要初始化数据//所有明细数据
        for (StrategyDetail strategyDetail : strategyDetails) {
            //如果zset已经存在某个column需要直接跳过//不然会出现数据库中的数据多了200,然后进行添加分数的时候
            //如果再次启动,没有进行跳过,那么会重复讲mysql中的数据的分数偏移到redis上  所以要进行value-column判断
            if(strategyStatisVOService.isColumnExistsZset(strategyDetail.getId(), RedisKeys.STRATEGY_ZSET_ABROADCDS.getPrefix())){
                continue;
            }
            int scores = strategyDetail.getFavornum()+strategyDetail.getThumbsupnum();
            strategyStatisVOService.addAboardOrChinaScore(strategyDetail.getId(),scores);
        }
        System.out.println("---------------国外推荐初始化结束操作--------------");*/

    }
}
